package br.com.sistemasaude.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;

import org.richfaces.component.Dropzone;
import org.richfaces.event.DragEvent;
import org.richfaces.event.DropEvent;

import br.com.sistemasaude.bean.Agendamento;
import br.com.sistemasaude.bean.Medico;
import br.com.sistemasaude.bean.RelMedAgend;
import br.com.sistemasaude.bean.Usuario;
import br.com.sistemasaude.dao.AgendamentoDAO;
import br.com.sistemasaude.dao.AgendamentoDAOImpl;
import br.com.sistemasaude.dao.AlocamentoDAO;
import br.com.sistemasaude.dao.AlocamentoDAOImpl;
import br.com.sistemasaude.dao.MedicoDAO;
import br.com.sistemasaude.dao.MedicoDaoImp;
import br.com.sistemasaude.dao.UsuarioDAO;
import br.com.sistemasaude.dao.UsuarioDaoImp;

public class AgendamentoController {

	private String nome;
	private String particular;
	  
    List<Medico> medicosDisponiveis = new ArrayList<Medico>();
    List<Usuario> medicos = new ArrayList<Usuario>();
    List<Usuario> pacientes = new ArrayList<Usuario>();
    List<Usuario> enfermeiros = new ArrayList<Usuario>();
    
    private Object dropValue;    
    private Object dragValue;
    
    private int id_agendamento;
    
    List<Agendamento> agendamentos = new ArrayList<Agendamento>();
	public Date data_agendamento;
    
    public AgendamentoController(){
    	this.data_agendamento = new Date();
    	getListarMedico();
    }
    
    public List<Medico> getListarMedico(){	
    	MedicoDAO medicoDAO = new MedicoDaoImp();
    
    	medicosDisponiveis = medicoDAO.localizarAll(new Date());
    	return medicosDisponiveis;
    }
    
  //Retorna lista de pacientes
    public List<SelectItem> getPacientesList(){
    	UsuarioDaoImp udao = new UsuarioDaoImp();
	    List<Usuario> list         = udao.listar();  
	    List<SelectItem> comboList    = new ArrayList<SelectItem>(); 
	    
	    for(Usuario usuario : list)  
	        comboList.add(new SelectItem(usuario.getNome()+" "+usuario.getSobrenome()));  
	      
	    return comboList;  
	}  
    
    public void listarAtendimento(){
    	
    	AgendamentoDAO dao = new AgendamentoDAOImpl();
    	
    	Date dataAtendimento = new Date();
    	
    	Agendamento pacienteAgendado = dao.buscar(getId_agendamento());
    	pacienteAgendado.getIdUsuario();
    	pacienteAgendado.getParticular();
    	pacienteAgendado.setDtAtendimento(dataAtendimento);
    }
    

    
	public List<Usuario> getEnfermeiros() {
		return enfermeiros;
	}

	public void setEnfermeiros(List<Usuario> enfermeiros) {
		this.enfermeiros = enfermeiros;
	}

	public List<Usuario> getMedicos() {
		return medicos;
	}

	public void setMedicos(List<Usuario> medicos) {
		this.medicos = medicos;
	}
	
	
		
	public List<Medico> getMedicosDisponiveis() {
		return medicosDisponiveis;
	}

	public void setMedicosDisponiveis(List<Medico> medicosDisponiveis) {
		this.medicosDisponiveis = medicosDisponiveis;
	}

	public void movePaciente(Object fm, Object especialidade) {
        List<Usuario> target = null;
        if ("enfermeiro".equals(especialidade)) {
            target = enfermeiros;
            
        } else if ("medico".equals(especialidade)) {
            target = medicos;
            
        } 
   Usuario usu = ((Medico) fm).getUsuario();
    if (null != target && !this.nome.equals(usu.getNome()+" "+usu.getSobrenome())) {
            target.add(usu);
            medicosDisponiveis.remove(fm);
        }
    }

	
    public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public void processDropMethod(DropEvent event) {
        Dropzone dropzone = (Dropzone) event.getComponent();
        movePaciente(event.getDragValue(), dropzone.getDropValue());
       
    }

    public void processDragMethod(DragEvent event) {
              event.getAcceptedTypes();
              
        dragValue = event.getDragValue();
        dropValue = event.getDropValue();
    }

	public List<Usuario> getPacientes() {
		return pacientes;
	}

	public void setPacientes(List<Usuario> pacientes) {
		this.pacientes = pacientes;
	}

	public Object getDropValue() {
		return dropValue;
	}

	public void setDropValue(Object dropValue) {
		this.dropValue = dropValue;
	}

	public Object getDragValue() {
		return dragValue;
	}

	public void setDragValue(Object dragValue) {
		this.dragValue = dragValue;
	}
	
	public String salvaAgendamento(){
		
		
		Usuario paciente = null;
		UsuarioDAO usuarioDAO = new UsuarioDaoImp();
		paciente = usuarioDAO.localizaCliente(getNome());
		Agendamento agendamento = new Agendamento();
		agendamento.setParticular(getParticular().equals("Sim")?1:0);
		agendamento.setIdUsuario(paciente);
		agendamento.setDtAgendamento(new Date());
		agendamento.setDtAtendimento(data_agendamento);
		AgendamentoDAO agendamentoDAO = new AgendamentoDAOImpl();
		agendamentoDAO.salvar(agendamento);
	
		MedicoDAO medicoDAO = new MedicoDaoImp();
		RelMedAgend alocacao = new RelMedAgend();
		AlocamentoDAO alocamentoDAO = new AlocamentoDAOImpl();
		for (Usuario usuMedico : medicos) {

			alocacao.setAgendamento(agendamento);
			Medico medico = medicoDAO.localizarMedicoPeloUsuario(usuMedico);
			alocacao.setMedico(medico);
			alocamentoDAO.salvar(alocacao);
			
			
		}
		
		for (Usuario usuEnfermeiro: enfermeiros) {
			
			alocacao.setAgendamento(agendamento);
			Medico medico = medicoDAO.localizarMedicoPeloUsuario(usuEnfermeiro);
			alocacao.setMedico(medico);
			alocamentoDAO.salvar(alocacao);
			
		}
		
		
		
		return "sucesso";
	}

	public String listarAgendamentos(){
		AgendamentoDAO agendamentoDAO = new AgendamentoDAOImpl();
		
		this.agendamentos = agendamentoDAO.listaAgendamentos(this.data_agendamento);
		
		return "";
	}
	
	public List<Agendamento> getAgendamentos() {
		return agendamentos;
	}

	public void setAgendamentos(List<Agendamento> agendamentos) {
		this.agendamentos = agendamentos;
	}

	public Date getData_agendamento() {
		return data_agendamento;
	}

	public void setData_agendamento(Date data_agendamento) {
		this.data_agendamento = data_agendamento;
	}

	public String getParticular() {
		return particular;
	}

	public void setParticular(String particular) {
		this.particular = particular;
	}

	public int getId_agendamento() {
		return id_agendamento;
	}

	public void setId_agendamento(int id_agendamento) {
		this.id_agendamento = id_agendamento;
	}
	
}
